
package com.ys.chatserver.http.logic;

import com.ys.chatserver.http.logic.dto.RosterElementEntity;

public class LogicUtils
{
	/**
	 * 查询用户信息(使用uid).
	 * 
	 * @param myUid 查询发起人的uid，这个uid指的是客户端提起这个查询时的当前登陆者uid
	 * 				，指明此uid后本sql将同时提供被查询作为好友的额外信息。本参数可为null（表示不需要查询好友的额外信息）
	 */
	public static RosterElementEntity queryUserInfoByUID(String uidOfFriend, String myUid) throws Exception
	{
		return queryUserInfo(false, null , uidOfFriend, myUid);
	}
	/**
	 * 查询用户信息
	 * 
	 * @param myUid 查询发起人的uid，这个uid指的是客户端提起这个查询时的当前登陆者uid
	 * 				，指明此uid后本sql将同时提供被查询作为好友的额外信息。本参数可为null（表示不需要查询好友的额外信息）
	 */
	public static RosterElementEntity queryUserInfo(String mailOfFriend, String myUid) throws Exception
	{
		return queryUserInfo(true, mailOfFriend , null, myUid);
	}
	/**
	 * 查询用户信息.
	 * 
	 * @param useMail true表示使用U友的email查询，否则表示用uid查询
	 * @param myUid 查询发起人的uid，这个uid指的是客户端提起这个查询时的当前登陆者uid
	 * 				，指明此uid后本sql将同时提供被查询作为好友的额外信息。本参数可为null（表示不需要查询好友的额外信息）
	 */
	public static RosterElementEntity queryUserInfo(boolean useMail
			, String mailOfFriend, String uidOfFriend, String myUid) throws Exception
	{
		String baseSql = getUSER_INFI_BASE_SQL(myUid);

		String[] userInfoItems = null;
		// 使用好友的mail地址查找信息
		if(useMail)
			userInfoItems = LogicProcessor2.db.querySingleRowItems(baseSql+" where " +
//					"user_status = 1 and " +
					"user_mail = '"+mailOfFriend+"'");
		// 否则使用好友的uid查找信息
		else
			userInfoItems = LogicProcessor2.db.querySingleRowItems(baseSql+" where " +
//					"user_status = 1 and " +
					"user_uid = '"+uidOfFriend+"'");
		return constructUserInfo(userInfoItems);
	}
	
	public static RosterElementEntity constructUserInfo(Object[] userInfoItems)
	{
		RosterElementEntity friendInfoForFound = null;
		// 查找到了好友信息
		if(userInfoItems != null)
		{
			friendInfoForFound = new RosterElementEntity();
			int i = 0;
			friendInfoForFound.setUser_uid((String)userInfoItems[i++]);
			friendInfoForFound.setUser_mail((String)userInfoItems[i++]);
			friendInfoForFound.setNickname((String)userInfoItems[i++]);
			friendInfoForFound.setUser_sex(Integer.valueOf(userInfoItems[i++].toString()));
			friendInfoForFound.setRegister_time((String)userInfoItems[i++]);
			friendInfoForFound.setLatest_login_time((String)userInfoItems[i++]);
			i++;//查询条件中已包含密码,不进行Set
			friendInfoForFound.setLiveStatus(Integer.valueOf((String)userInfoItems[i++]));
			friendInfoForFound.setUserAvatarFileName((String)userInfoItems[i++]);
			friendInfoForFound.setWhatsUp((String)userInfoItems[i++]);
			
			//friendInfoForFound.setMaxFriend((String)userInfoItems[i++]);
			friendInfoForFound.setUserDesc((String)userInfoItems[i++]);
			friendInfoForFound.setUserType(Integer.valueOf(userInfoItems[i++].toString()));
			
			friendInfoForFound.setLatest_login_ip((String)userInfoItems[i++]);
			friendInfoForFound.setDevType(Integer.valueOf((String) userInfoItems[i++]));
			friendInfoForFound.setAccountType(Integer.valueOf((String) userInfoItems[i++]));
			friendInfoForFound.setExpireTime((String) userInfoItems[i++]);
			
			friendInfoForFound.setFriendRemark((String)userInfoItems[i++]);
			friendInfoForFound.setFriendMobileNum((String)userInfoItems[i++]);
			friendInfoForFound.setFriendMoreDesc((String)userInfoItems[i++]);
			friendInfoForFound.setFriendPicFileName((String)userInfoItems[i++]);

		}
		return friendInfoForFound;
	}
	
	/**
	 * 返回用户信息查询SQL。
	 * 
	 * @param myUid 查询发起人的uid，这个uid指的是客户端提起这个查询时的当前登陆者uid
	 * 				，指明此uid后本sql将同时提供被查询作为好友的额外信息。本参数可为null（表示不需要查询好友的额外信息）
	 */
	public static String getUSER_INFI_BASE_SQL(String myUid) 
	{
		boolean myUidNull = (myUid == null);
		
		return "select " +
	
				// ============================= 请确保以下字段的数量、顺序与方法constructUserInfo是严格一致的！  START
				"	user_uid" +
				"	,user_mail" +
				"	,nickname" +
				"	,user_sex" +
				"	,register_time" +
				"	,latest_login_time2" + // 自20140109(KChat2.0以后版本)起取的值由latest_login_time改为了latest_login_time2
				"	,user_psw" +
				"	,is_online" +
				"	,user_avatar_file_name" +
				"	,what_s_up" +
				"	,user_desc" +          // 自20140401(KChat2.5及以后版本)起启用
				"	,user_type" +          // 自20140417(KChat2.5.1及以后版本)起启用
				"	,latest_login_ip" +    // 自20181224(RainbowChat4.5及以后版本)起启用
				"   ,dev_type"+
				"   ,account_type"+
				"   ,expire_time"+
				// 如果提供了查询发起人的（也就是myUid参数）uid，会同时查询该指定用户作为该发起人的好友的额外信息
				// 查询性能说明：其实为了查出这些额外信息可以通过一个子查询并left join完成，但为了降低SQL阅读的复杂性
				//				，采用了4个子查询，好在数据库表中已添加唯一索引，所以查询性能影响不大
				"	," +(myUidNull?"null":"(select remark from chat_my_firends where user_uid='"+myUid+"' and friend_user_uid=a.user_uid) as remark")+
				"	," +(myUidNull?"null":"(select mobile_num from chat_my_firends where user_uid='"+myUid+"' and friend_user_uid=a.user_uid) as mobile_num")+
				"	," +(myUidNull?"null":"(select more_desc from chat_my_firends where user_uid='"+myUid+"' and friend_user_uid=a.user_uid) as more_desc")+
				"	," +(myUidNull?"null":"(select pic_file_name from chat_my_firends where user_uid='"+myUid+"' and friend_user_uid=a.user_uid) as pic_file_name")+
				// ============================= 请确保以下字段的数量、顺序与方法constructUserInfo是严格一致的！  END
			
			" from g_users a ";
	}	
	
	/**
	 * 返回用户信息查询SQL（支持分页、随机等）。
	 * 
	 * @param myUid 查询发起人的uid，这个uid指的是客户端提起这个查询时的当前登陆者uid
	 * 				，指明此uid后本sql将同时提供被查询作为好友的额外信息。本参数可为null（表示不需要查询好友的额外信息）
	 */
	public static String getUSER_INFI_RANDOM_SQL(String myUid)
	{
		return	"select {0}" +
				// ============================= 请确保以下字段的数量、顺序与方法constructUserInfo是严格一致的！  START
				"	user_uid" +
				"	,user_mail" +
				"	,nickname" +
				"	,user_sex" +
				"	,register_time" +
				"	,latest_login_time2" + // 自20140109(KChat2.0以后版本)起取的值由latest_login_time改为了latest_login_time2
				"	,user_psw" +
				"	,is_online" +
				"	,user_avatar_file_name" +
				"	,what_s_up" +
				"	,user_desc" +          // 自20140401(KChat2.5及以后版本)起启用
				"	,user_type" +          // 自20140417(KChat2.5.1及以后版本)起启用
				"	,latest_login_ip" +    // 自20181224(RainbowChat4.5及以后版本)起启用
				"   ,dev_type"+
				"   ,account_type"+
				"   ,expire_time"+
				//如果提供了查询发起人的（也就是myUid参数）uid，会同时查询该指定用户作为该发起人的好友的额外信息
				// 查询性能说明：其实为了查出这些额外信息可以通过一个子查询并left join完成，但为了降低SQL阅读的复杂性
				//				，采用了4个子查询，好在数据库表中已添加唯一索引，所以查询性能影响不大
				"	,(select remark from chat_my_firends where user_uid='"+myUid+"' and friend_user_uid=a.user_uid) as remark"+
				"	,(select mobile_num from chat_my_firends where user_uid='"+myUid+"' and friend_user_uid=a.user_uid) as mobile_num"+
				"	,(select more_desc from chat_my_firends where user_uid='"+myUid+"' and friend_user_uid=a.user_uid) as more_desc"+
				"	,(select pic_file_name from chat_my_firends where user_uid='"+myUid+"' and friend_user_uid=a.user_uid) as pic_file_name"+
				// ============================= 请确保以下字段的数量、顺序与方法constructUserInfo是严格一致的！  END
				
				// “order by newid()” 表示随机排序
				" from g_users a"+ // a 是表的别名
				" where user_status = 1 and user_uid != {1}{2}{3} order by {4}";
	}
	


}
